#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define int long long


int a[100005];
struct node {
	int l, r, index;
	bool operator<(const node& x) const {
		if (l != x.l)
			return l < x.l;
		else if (r != x.r)
			return r < x.r;
		else
			return index < x.index;
	}
};

signed main() {
	ios::sync_with_stdio(0), cout.tie(0), cout.tie(0);
	set<node>st;
	int n;
	cin >> n;
	for (int i = 1, l, r; i <= n; i++) {
		cin >> l >> r;
		st.insert({ l,r,i });
	}
	int ans = 0;
	while (!st.empty()) {
		ans++;
		auto cur = st.begin();
		while (cur != st.end()) {
			a[cur->index] = ans;
			auto tmp = st.lower_bound({ cur->r + 1,-1,-1 });
			st.erase(cur);
			cur = tmp;
		}
	}
	cout << ans << '\n';
	for (int i = 1; i <= n; i++) {
		cout << a[i] << '\n';
	}
	return 0;
}


//int a[100005];
//struct node
//{
//	int l, r,index;
//	bool operator<(const node& x)const {
//		if (l != x.l) {
//			return l < x.l;
//		}
//		if (r != x.r) {
//			return r < x.r;
//		}
//		return index < x.index;
//	}
//};
//signed main() {
//	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//	int n;
//	cin >> n;
//	multiset<node> st;
//	for (int i = 1,l,r; i <= n; i++) {
//		cin >> l >> r;
//		st.insert({ l,r,i });
//	}
//	int ans = 0;
//	while (!st.empty()) {
//		ans++;
//		auto cur = st.begin();
//		while (cur != st.end()) {
//			a[cur->index] = ans;
//			auto tmp = st.lower_bound({cur->r + 1,-1,-1});
//			st.erase(*cur);
//			cur = tmp;
//		}
//	}
//	cout << ans << endl;
//	for (int i = 1; i <= n; i++) {
//		cout << a[i] << '\n';
//	}
//	return 0;
//}
//int a[500005];
//int n, m, t;
//int qp(int x) {
//	return x * x;
//}
//int getm(int l, int r) {
//	vector<int> tmp;
//	for (int i = l; i <= r; i++) {
//		tmp.push_back(a[i]);
//	}
//	sort(tmp.begin(), tmp.end());
//	int sum = 0;
//	int len = r - l;
//	for (int i = 0; i < m && i < (len + 1) / 2; i++) {
//		sum += qp(tmp[len - i] - tmp[i]);
//	}
//	return sum;
//}
//void solve() {
//	cin >> n >> m >> t;
//	for (int i = 1; i <= n; i++) {
//		cin >> a[i];
//	}
//	int r = 1, l = 1;
//	int ans = 0;
//	while (r <= n) {
//		int p = 1;
//		while (p) {
//			if (r + p <= n && getm(l, r + p) <= t) {
//				r += p;
//				p *= 2;
//			}
//			else
//				p /= 2;
//		}
//		l = r + 1;
//		r = l;
//		ans++;
//	}
//	cout << ans << '\n';
//}
//
//void solve() {
//	int l, r;
//	cin >> l >> r;
//	if (r == l + 2) {
//		cout << l << ' ' << l + 1 << ' ' << l + 2 << '\n';
//		return;
//	}
//	vector<int> ans;
//	int base = 0;
//	for (int i = 31; i >= 0; i--) {
//		int tmp = (1ll << i);
//		if (r & tmp&&!(l&tmp)) {
//			ans.push_back(tmp);
//			ans.push_back(tmp - 1);
//			r >= tmp + 1 + base ? ans.push_back(tmp + 1) : ans.push_back(tmp - 2);
//			break;
//		}
//		if (r & tmp && l & tmp)
//			base += tmp;
//	}
//	for (auto x : ans) {
//		cout << x + base << ' ';
//	}
//	cout << '\n';
//}
//
//signed main() {
//	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//	int t;
//	cin >> t;
//	while (t--) {
//		solve();
//	}
//
//	return 0;
//}

//int a[500005];
//int c[500005];
//int ni1;
//int ni2;
//int cnt = 0;
//void msort(int l, int r) {
//	if (l == r)
//		return;
//	int m = (l + r) >> 1;
//	msort(l, m); msort(m + 1, r);
//	int i = l, j = m + 1, k = l;
//	while (i <= m && j <= r) {
//		if (a[i] <= a[j]) {
//			c[k++] = a[i++];
//		}
//		else {
//			c[k++] = a[j++];
//			cnt += m - i + 1;
//		}
//	}
//	while (i <= m)c[k++] = a[i++];
//	while (j <= r)c[k++] = a[j++];
//	for (int k = l; k <= r; k++)a[k] = c[k];
//}
//signed main() {
//	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//	int n;
//	while (cin >> n) {
//		if (n == 1) {
//			cin >> a[1] >> a[1];
//			cout << "TAK\n";
//			continue;
//		}
//		for (int i = 1, l = 1; i <= n * n; i++) {
//			cin >> a[l];
//			if (a[l])
//				l++;
//		}
//		msort(1, n * n - 1);
//		ni1 = cnt; cnt = 0;
//		for (int i = 1, l = 1; i <= n * n; i++) {
//			cin >> a[l];
//			if (a[l])
//				l++;
//		}
//		msort(1, n * n - 1);
//		ni2 = cnt; cnt = 0;
//		if ((ni1&1)== (ni2&1))
//			cout << "TAK\n";
//		else
//			cout << "NIE\n";
//	}
//	return 0;
//}


//int b[10005];
//int a[10005];
//map<pair<int, int>, bool> ok;
//
//signed main() {
//	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//	int n, p, h, m;
//	cin >> n >> p >> h >> m;
//	for (int i = 1,l,r; i <= m; i++) {
//		cin >> l >> r;
//		if (l > r)
//			swap(l, r);
//		if (ok[{l, r}]) continue;
//		b[l + 1]--;
//		b[r]++;
//		ok[{l, r}] = 1;
//	}
//	for (int i = 1; i <= n; i++) {
//		a[i] = b[i] + a[i - 1];
//	}
//	for (int i = 1; i <= n; i++) {
//		cout << a[i] + h << '\n';
//	}
//	return 0;
//}